iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
Python

30天Python資料分析挑戰:從基礎到視覺化系列 第 29

Day 29: 使用 Sklearn 進行分類分析

  • 分享至 

  • xImage
  •  

Day 29: 使用 Sklearn 進行分類分析

分類分析是機器學習中常見的任務之一,目的是根據已知的標籤資料對新的樣本進行分類。今天,我們將使用 Sklearn 進行分類任務,並以 Iris 資料集為例,建立一個分類模型來預測不同的花卉種類。

1. 分類分析的基本概念

分類(Classification)是指根據樣本的特徵將其歸類為某一特定類別。常見的分類演算法包括:

  • 邏輯回歸(Logistic Regression):適用於二元分類。
  • 支持向量機(Support Vector Machine, SVM):適合於二元或多元分類。
  • 決策樹(Decision Tree):可以處理多元分類且對資料有較好的解釋性。
  • 隨機森林(Random Forest):基於多顆決策樹的集成學習模型,具有高準確率和穩定性。

今天,我們將使用 Logistic Regression 來對 Iris 資料集進行花卉分類,並展示如何進行模型訓練、預測與評估。
先在同一個資料夾建立一個叫做sklearn的檔案。
https://ithelp.ithome.com.tw/upload/images/20241013/20140380Wi0PPqW7gf.jpg

一開始先用這一段程式碼

from google.colab import drive
drive.mount('/content/drive/')
import pandas as pd
iris_df=pd.read_csv('/content/drive/MyDrive/iris/iris_dataset.csv')
print(iris_df.head())

2. 準備資料集

首先,我們需要準備資料集,包括資料的特徵和標籤。

from sklearn.model_selection import train_test_split

# 選取自變數(特徵)
X = iris_df[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']]

# 選取目標變數(標籤)
y = iris_df['target']

# 將資料分為訓練集與測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 檢視訓練集和測試集的大小
print(f'訓練集大小:{X_train.shape[0]} 筆')
print(f'測試集大小:{X_test.shape[0]} 筆')

https://ithelp.ithome.com.tw/upload/images/20241013/20140380Xy4lg7jkUD.jpg
這段程式碼會將 Iris 資料集分為訓練集(80%)和測試集(20%)。

3. 建立與訓練分類模型

我們將使用邏輯回歸(Logistic Regression)來建立分類模型,並進行模型訓練。

from sklearn.linear_model import LogisticRegression

# 建立邏輯回歸模型
classifier = LogisticRegression(max_iter=200)

# 使用訓練集進行模型訓練
classifier.fit(X_train, y_train)

# 顯示模型的係數與截距
print(f'模型係數:{classifier.coef_}')
print(f'模型截距:{classifier.intercept_}')

https://ithelp.ithome.com.tw/upload/images/20241013/20140380SEiEea4cE3.jpg
這段程式碼會建立一個邏輯回歸模型,並使用訓練集進行訓練,最後輸出模型的係數和截距。

4. 模型預測與評估

在模型訓練完成後,我們可以使用測試集進行預測,並評估模型的性能。

4.1 使用測試集進行預測

# 使用測試集進行預測
y_pred = classifier.predict(X_test)

# 顯示前五筆預測結果
print("實際標籤:", y_test.values[:5])
print("預測標籤:", y_pred[:5])

https://ithelp.ithome.com.tw/upload/images/20241013/20140380FgNip44MUc.jpg
這段程式碼會使用測試集進行預測,並顯示前五筆實際標籤與預測標籤的對比。

4.2 模型性能評估

我們可以使用混淆矩陣(Confusion Matrix)、準確率(Accuracy)、精確率(Precision)、召回率(Recall)等指標來評估模型的性能。

from sklearn.metrics import confusion_matrix, classification_report, accuracy_score

# 計算混淆矩陣
conf_matrix = confusion_matrix(y_test, y_pred)
print("混淆矩陣:")
print(conf_matrix)

# 顯示分類報告
print("\n分類報告:")
print(classification_report(y_test, y_pred))

# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
print(f'準確率:{accuracy:.2f}')

https://ithelp.ithome.com.tw/upload/images/20241013/20140380kOu7LNWXBI.jpg
這段程式碼會輸出模型的混淆矩陣和分類報告,包括準確率、精確率、召回率和 F1-score 等指標。

5. 視覺化分類邊界

我們可以通過視覺化分類邊界來了解模型的分類效果,這對於只有兩個特徵的情境下尤其有用。

import matplotlib.pyplot as plt
import numpy as np

# 選取兩個特徵進行視覺化
X_vis = iris_df[['sepal length (cm)', 'sepal width (cm)']]
y_vis = y

# 重新分割資料集
X_train_vis, X_test_vis, y_train_vis, y_test_vis = train_test_split(X_vis, y_vis, test_size=0.2, random_state=42)

# 訓練模型
classifier_vis = LogisticRegression(max_iter=200)
classifier_vis.fit(X_train_vis, y_train_vis)

# 建立網格座標進行預測
x_min, x_max = X_vis['sepal length (cm)'].min() - 1, X_vis['sepal length (cm)'].max() + 1
y_min, y_max = X_vis['sepal width (cm)'].min() - 1, X_vis['sepal width (cm)'].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1), np.arange(y_min, y_max, 0.1))

# 預測分類邊界
Z = classifier_vis.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

# 繪製分類邊界
plt.contourf(xx, yy, Z, alpha=0.8, cmap='Pastel1')
plt.scatter(X_train_vis['sepal length (cm)'], X_train_vis['sepal width (cm)'], c=y_train_vis, edgecolors='k', marker='o', label='訓練資料')
plt.scatter(X_test_vis['sepal length (cm)'], X_test_vis['sepal width (cm)'], c=y_test_vis, edgecolors='k', marker='x', label='測試資料')
plt.title('花萼長度與寬度的分類邊界')
plt.xlabel('花萼長度 (cm)')
plt.ylabel('花萼寬度 (cm)')
plt.legend()
plt.show()

https://ithelp.ithome.com.tw/upload/images/20241013/201403809D6EOmAJF1.jpg
這段程式碼會根據花萼長度與寬度繪製分類邊界,並將訓練資料與測試資料疊加在圖中,幫助我們了解模型的分類效果。

6. 使用其他分類模型

除了邏輯回歸外,Sklearn 還提供了多種分類模型,例如決策樹、隨機森林、支持向量機等。我們可以輕鬆地替換不同的分類器來進行比較。

from sklearn.tree import DecisionTreeClassifier

# 建立決策樹分類器
decision_tree = DecisionTreeClassifier()

# 訓練模型
decision_tree.fit(X_train, y_train)

# 預測與評估
y_pred_tree = decision_tree.predict(X_test)
print("決策樹模型的準確率:", accuracy_score(y_test, y_pred_tree))

這段程式碼使用決策樹進行分類,並計算其準確率。我們可以用相同的方式測試其他分類器。

7. 小結

今天我們學習了如何使用 Sklearn 進行分類分析,包括:

  1. 資料準備:選取特徵與標籤,將資料分為訓練集與測試集。
  2. 建立與訓練模型:使用邏輯回歸進行分類模型訓練。
  3. 模型預測與評估:使用測試集進行預測,並計算混淆矩陣和分類

上一篇
Day 28: 使用 Sklearn 進行簡單的線性回歸
下一篇
Day 30: 模型評估與準確度測試
系列文
30天Python資料分析挑戰:從基礎到視覺化30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言